home *** CD-ROM | disk | FTP | other *** search
-
- #include <SetUpA4.h>
- #include "journalDriver.h"
-
-
- /* globals used by this driver */
-
- int eventFlags ; /* future expansion for event types to trap */
- int fileRefNum ;
- int stateFlags ; /* flags used by driver */
- Str255 appName ; /* name of current application */
-
-
-
- int main(cntrlParam *paramBlock, DCtlPtr devCtlEntry, int n)
- {
- int err ;
-
- RememberA4() ;
-
- switch(n) {
- case CMD_OPEN:
- case CMD_PRIME:
- case CMD_STATUS:
- return noErr ;
- break ;
-
- case CMD_CONTROL:
- SetUpA4() ;
- err = DRVRControl(paramBlock, devCtlEntry) ;
- RestoreA4() ;
- break ;
-
- case CMD_CLOSE:
- return -24 ;
- break ;
- }
- }
-
- /*----------------------
-
- DRVRControl
-
- The control routine. There are two main sources of control calls
- for this driver, the cdev or the journaling mechanism.
-
- Calls from the cdev are either configuration calls or enabling/disabling
- calls.
-
- Calls from the journaling mechanism only occur when the journaling is
- activated by a cdev control call. If recording is taking place, events
- that are required are recorded into a journal file. The cdev will have
- made calls to specify the required types of events for recording.
-
- ------------------------*/
-
- int DRVRControl(CntrlParam *ctlPB, DCtlPtr dCtl)
- {
- int refNum ;
- OSErr err ;
- P_JrnlFileParam params ;
- SignedByte permission = fsRdWrPerm ;
-
- if (dCtl->dCtlStorage == NULL)
- return noErr ;
-
- refNum = dCtl->dCtlRefNum ;
-
- switch (ctlPB->csCode) {
- case JRNL_PLAY_CNTRL:
- break ;
-
- case JRNL_RECORD_CNTRL:
- DoJournalRecord(ctlPB) ;
- break ;
-
- case JRNL_ON:
- *((int*)JournalRef) = refNum ;
- *((int*)JournalFlag) = JRNL_RECORD ;
-
- break ;
-
- case JRNL_OFF:
- *((int*)JournalFlag) = JRNL_NEUTRAL ;
- *((int*)JournalRef) = JRNL_NEUTRAL ;
-
- err = FSClose((fileRefNum)) ;
-
- break ;
-
-
- case JRNL_OPEN_FILE:
- params = (P_JrnlFileParam)(ctlPB->csParam) ;
- eventFlags = params->eventFlags ;
- err = HCreate(params->vRefNum, params->dirID, params->fName,
- params->creator, 'TEXT') ;
- err = HOpen(params->vRefNum, params->dirID, params->fName,
- permission, &fileRefNum) ;
- WriteCdevParams(params) ;
- break ;
- }
- return noErr ;
- }
-
-
- /*----------------------
-
- DoJournalRecord
-
- ------------------------*/
-
- void DoJournalRecord(CntrlParam *paramBlock)
- {
- int callType ;
- EventRecord *eventPtr ;
- long count ;
- OSErr err ;
- char *eventString ;
- unsigned long dateTime ;
- Str255 theTime ;
- Str255 curAppName ;
- int apRefNum ;
- Handle appParams ;
-
- callType = (paramBlock->csParam)[2] ;
-
- switch(callType) {
- case JRNL_TICK_COUNT:
- break ;
-
- case JRNL_GET_MOUSE:
- break ;
-
- case JRNL_BUTTON:
- break ;
-
- case JRNL_GET_KEYS:
- break ;
-
- case JRNL_EVENT:
- eventPtr = (*(EventRecord**)paramBlock->csParam) ;
-
- if (eventPtr->what != nullEvent) {
-
- if ( (!(IsSet(stateFlags, STATE_KEY_BIT))) &&
- IsSet(eventFlags, TIME_STAMP_BIT)) {
- /* print out time stamp */
-
- eventString = EV_DELIMIT ;
- PrintIt(err, fileRefNum, count, eventString) ;
- GetDateTime(&dateTime) ;
- IUTimeString(dateTime, TRUE, theTime) ;
- PrintIt(err, fileRefNum, count, theTime) ;
- eventString = EV_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- /* print out application name if new */
-
- GetAppParms(curAppName, &apRefNum, &appParams) ;
- if (IUCompString(curAppName, (appName)) != 0) {
- eventString = EV_APPLIC_NAME ;
- PrintIt(err, fileRefNum, count, eventString) ;
- GetAppParms((appName), &apRefNum, &appParams) ;
- PrintIt(err, fileRefNum, count, appName) ;
- eventString = EV_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
-
- switch (eventPtr->what) {
- case mouseDown:
- case mouseUp:
- eventString = NULL ;
- DoMouseDown(eventPtr) ;
- SetFlag(stateFlags, STATE_EVENT_MOUSE) ;
- ClearFlag(stateFlags, STATE_EVENT_KEY) ;
- ClearFlag(stateFlags, STATE_EVENT_OTHER) ;
- break ;
-
- case keyDown:
- case autoKey:
- eventString = NULL ;
- DoKeyDown(eventPtr) ;
- SetFlag(stateFlags, STATE_EVENT_KEY) ;
- ClearFlag(stateFlags, STATE_EVENT_MOUSE) ;
- ClearFlag(stateFlags, STATE_EVENT_OTHER) ;
- ClearMouseBits(stateFlags) ;
- break ;
-
- case updateEvt:
- eventString = EV_UPDATE ;
- break ;
- case diskEvt:
- eventString = EV_DISK ;
- break ;
- case networkEvt:
- eventString = EV_UPDATE ;
- break ;
- case driverEvt:
- eventString = EV_DRIVER ;
- break ;
- case app1Evt:
- eventString = EV_APP1 ;
- break ;
- case app2Evt:
- eventString = EV_APP2 ;
- break ;
- case app3Evt:
- eventString = EV_APP3 ;
- break ;
- case app4Evt:
- switch (((unsigned long)eventPtr->message) >> 24) {
- case MouseMovedEvt:
- eventString = EV_MOUSE_MOVED ;
- break ;
-
- case SuspendResumeEvt:
- if (eventPtr->message & activeFlag)
- eventString = EV_SUSPENDING ;
- else
- eventString = EV_RESUMING ;
- }
- break ;
-
- case activateEvt:
- if ((eventPtr->modifiers & activeFlag) == 0)
- eventString = EV_DEACTIVATE ;
- else
- eventString = EV_ACTIVATE ;
- break ;
- }
-
- if (eventString != NULL) {
- SetFlag(stateFlags, STATE_EVENT_OTHER) ;
- ClearFlag(stateFlags, STATE_EVENT_KEY) ;
- ClearFlag(stateFlags, STATE_EVENT_MOUSE) ;
- ClearMouseBits(stateFlags) ;
-
- if (IsSet(stateFlags, STATE_KEY_BIT)) {
- eventString = EV_ONLY_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- ClearFlag(stateFlags, STATE_KEY_BIT) ;
- }
-
- PrintIt(err, fileRefNum, count, eventString) ;
- eventString = EV_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
- break ;
-
- }
- }
-
-
- /*----------------------
-
- DoMouseDown
-
- Handle a mouse down type event. What gets written depends
- on where the mouse went down and if it is a double
- click.
-
- ------------------------*/
-
- void DoMouseDown(EventRecord *eventPtr)
- {
- int mouseIn, result ;
- WindowPtr theWindow ;
- long count, menuHit ;
- OSErr err ;
- char *eventString ;
- Boolean mDown ; /* TRUE if this is a mouse down */
- Point hitPoint ;
- ControlHandle theControl ;
- Str255 controlName ;
-
- mDown = (eventPtr->what == mouseDown) ;
-
- mouseIn = FindWindow(eventPtr->where, &theWindow) ;
-
- /* print out the window title */
- if (theWindow != NULL) {
- PrintWindowTitle(TRUE) ;
- }
-
- if (IsSet(stateFlags, STATE_KEY_BIT)) {
- eventString = EV_ONLY_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- ClearFlag(stateFlags, STATE_KEY_BIT) ;
- }
-
- eventString = (eventPtr->what == mouseDown) ? EV_MOUSE_DOWN : EV_MOUSE_UP ;
- PrintIt(err, fileRefNum, count, eventString) ;
-
- switch (mouseIn) {
-
- case inDesk:
- ClearMouseBits(stateFlags) ;
- eventString = EV_IN_DESK ;
- break ;
-
- case inMenuBar:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_MENU_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_MENU_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintMenuTitle(-1, menuHit) ;
- }
- eventString = EV_IN_MENU_BAR ;
- break ;
-
- case inSysWindow:
- ClearMouseBits(stateFlags) ;
- eventString = EV_IN_SYS_WIND ;
- break ;
-
- case inContent:
- eventString = EV_IN_CONTENT ;
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_CONTENT_BIT) ;
- }
- else
- if ( (IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_CONTENT_BIT)) ) {
-
- ClearMouseBits(stateFlags) ;
- hitPoint.v = eventPtr->where.v ;
- hitPoint.h = eventPtr->where.h ;
- GlobalToLocal(&hitPoint) ;
- result = FindControl(hitPoint, theWindow, &theControl) ;
- if (theControl != NULL) {
- GetCTitle(theControl, controlName) ;
- if (controlName[0] > 0) {
- PrintIt(err, fileRefNum, count, controlName) ;
- eventString = NULL ;
- }
- }
- }
-
- break ;
-
- case inDrag:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_DRAG_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_DRAG_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintWindowTitle(TRUE) ;
- }
- eventString = EV_IN_DRAG ;
- break ;
-
- case inGrow:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_GROW_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_GROW_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintWindowTitle(TRUE) ;
- }
- eventString = EV_IN_GROW ;
- break ;
-
- case inGoAway:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_GOAWAY_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_GOAWAY_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintWindowTitle(TRUE) ;
- }
- eventString = EV_IN_GO_AWAY ;
- break ;
-
- case inZoomIn:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_ZOOMIN_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_ZOOMIN_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintWindowTitle(TRUE) ;
- }
- eventString = EV_IN_ZOOM_IN ;
- break ;
-
- case inZoomOut:
- if (mDown) {
- ClearMouseBits(stateFlags) ;
- SetFlag(stateFlags, STATE_MOUSE_ZOOMOUT_BIT) ;
- }
- else
- if ((IsSet(stateFlags, STATE_EVENT_MOUSE)) &&
- (IsSet(stateFlags, STATE_MOUSE_ZOOMOUT_BIT))) {
- ClearMouseBits(stateFlags) ;
- menuHit = *((long*)MenuDisable) ;
- PrintWindowTitle(TRUE) ;
- }
- eventString = EV_IN_ZOOM_OUT ;
- break ;
- }
- if (eventString != NULL) {
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
-
-
-
-
- /*----------------------
-
- DoKeyDown
-
- Handle a keyDown event. The basic flow of this function is :
-
- get the ASCII character pressed from the event record
- if the Command Key was pressed
- if the use canceled (cmd-.)
- write out the cancel
- else
- (write out menu event )
-
- if selected a menu item by command key
- write out the menu item
- else
- write out the key press
- else
- update printing characters flag
- if the character is printable
- print out the character
- else
- print out a character representation
- if the character is a linefeed or return
- write out a return
-
- ------------------------*/
-
- void DoKeyDown(EventRecord *eventPtr)
- {
- char *eventString ;
- long count ;
- OSErr err ;
- char keyPress ;
- int keyCode ;
- long menuHit ;
-
- keyPress = eventPtr->message & charCodeMask ;
-
- if (eventPtr->modifiers & cmdKey) {
- /* command key press of some type */
-
- if (IsSet(stateFlags, STATE_KEY_BIT)) {
- eventString = EV_ONLY_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- ClearFlag(stateFlags, STATE_KEY_BIT) ;
- }
-
- if (keyPress == '.') {
- eventString = EV_CANCEL ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- else {
- menuHit = MenuKey(keyPress) ;
- PrintMenuTitle(keyPress, menuHit) ;
- }
- }
- else {
- /* entering normal text or control/shift/option key modifications */
-
-
- PrintWindowTitle((!(IsSet(stateFlags, STATE_KEY_BIT)))) ;
- SetFlag(stateFlags, STATE_KEY_BIT) ;
-
- if (isascii(keyPress)) {
- if ((isprint(keyPress)) || (keyPress == '\015') || (keyPress == '\012')) {
- if ((keyPress == '\015') || (keyPress == '\012')) {
- eventString = EV_CR ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- count = 1 ;
- err = FSWrite((fileRefNum), &count, (Ptr) &keyPress) ;
- }
- else {
- keyCode = (eventPtr->message & keyCodeMask)>>8 ;
- eventString = GetNonPrintingKey(keyCode) ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
- else {
- /* an extended printable mac character */
- count = 1 ;
- err = FSWrite((fileRefNum), &count, (Ptr) &keyPress) ;
- }
- }
- }
-
-
- /*----------------------
-
- PrintMenuTitle
-
- Print out the item name and menu title for a menu selection.
-
- ------------------------*/
-
- void PrintMenuTitle(char keyPress, long menuHit)
- {
- long count ;
- Str255 menuStr ;
- int menuID, menuItem ;
- MenuHandle menuH ;
- OSErr err ;
- char *eventString ;
- long enableTest ;
-
- eventString = EV_MENU_TITLE ;
- PrintIt(err, fileRefNum, count, eventString) ;
-
- menuID = HiWord(menuHit) ;
- menuItem = LoWord(menuHit) ;
- menuH = GetMHandle(menuID) ;
- if (menuH != NULL) {
- eventString = (char*)((MenuPtr)(*menuH))->menuData ;
- if ((eventString[0] == 1) && (eventString[1] == APPLE_MENU_CHAR))
- eventString = EV_APPLE_MENU ;
- PrintIt(err, fileRefNum, count, eventString) ;
-
- eventString = EV_MENU_ITEM ;
- PrintIt(err, fileRefNum, count, eventString) ;
-
- GetItem(menuH, menuItem, menuStr) ;
- PrintIt(err, fileRefNum, count, menuStr) ;
-
- if (menuItem < 32) {
- enableTest = 1<<menuItem ;
- if ( !(((MenuPtr)(*menuH))->enableFlags & enableTest)) {
- eventString = EV_MENU_DISABLE ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
- }
- else
- if (keyPress != -1) {
- eventString = EV_CMD_KEY ;
- PrintIt(err, fileRefNum, count, eventString) ;
- count = 1 ;
- err = FSWrite((fileRefNum), &count, (Ptr) &keyPress) ;
- }
- eventString = EV_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
-
-
-
- /*----------------------
-
- PrintWindowTitle
-
- Print out the title and general kind of a window.
-
- ------------------------*/
-
- void PrintWindowTitle(Boolean mustPrint)
- {
- WindowPtr theWindow ;
- long count ;
- Str255 windowName ;
- char *eventString ;
- OSErr err ;
- Boolean transition ; /* transition between window and/or dialog */
-
-
- theWindow = FrontWindow() ;
- transition = mustPrint ;
-
- if (theWindow != NULL) {
- if ( ((WindowPeek)theWindow)->windowKind == 2 ) {
- eventString = EV_KEY_DIALOG ;
- if (IsSet(stateFlags, STATE_WINDOW_BIT)) {
- ClearFlag(stateFlags, STATE_WINDOW_BIT) ;
- transition = TRUE ;
- }
- SetFlag(stateFlags, STATE_DIALOG_BIT) ;
- }
- else {
- if (IsSet(stateFlags, STATE_DIALOG_BIT)) {
- ClearFlag(stateFlags, STATE_DIALOG_BIT) ;
- transition = TRUE ;
- }
- SetFlag(stateFlags, STATE_WINDOW_BIT) ;
- eventString = EV_KEY_WINDOW ;
- }
-
- if (transition) {
- PrintIt(err, fileRefNum, count, eventString) ;
- GetWTitle(theWindow, windowName) ;
- if (windowName[0] > 0) {
- PrintIt(err, fileRefNum, count, windowName) ;
- }
- else {
- eventString = EV_NO_WIND_NAME ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- eventString = EV_RETURN ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
- else {
- eventString = EV_KEY_NO_NAME ;
- PrintIt(err, fileRefNum, count, eventString) ;
- }
- }
-
- /*----------------------
-
- WriteCdevParams
-
- Write out information to the file about what state parameters
- are set in cdev when the file is opened.
-
- ------------------------*/
-
- void WriteCdevParams(P_JrnlFileParam params)
- {
- long count ;
- OSErr err ;
-
- count = 21 ;
- err = FSWrite((fileRefNum), &count, "--------------------\015") ;
- count = 27 ;
- err = FSWrite((fileRefNum), &count, "State Parameters from cdev\015") ;
- if (params->eventFlags & TIME_STAMP_BIT) {
- count = 11 ;
- err = FSWrite((fileRefNum), &count, "Time Stamp\015") ;
- }
-
- count = 22 ;
- err = FSWrite((fileRefNum), &count, "--------------------\015\015") ;
-
- }
-
-
-
- /*----------------------
-
- GetNonPrintingKey
-
- Return the correct string for a non-printing key.
-
- ------------------------*/
-
- char *GetNonPrintingKey(int keyCode)
- {
- char *returnVal ;
-
- switch(keyCode) {
- case 0x30: returnVal = EV_TAB ; break ;
- case 0x33: returnVal = EV_BACKSPACE ; break ;
- case 0x35: returnVal = EV_ESCAPE ; break ;
- case 0x4C: returnVal = EV_ENTER ; break ;
- case 0x47: returnVal = EV_CLEAR ; break ;
- case 0x60: returnVal = EV_F5 ; break ;
- case 0x61: returnVal = EV_F6 ; break ;
- case 0x62: returnVal = EV_F7 ; break ;
- case 0x63: returnVal = EV_F3 ; break ;
- case 0x64: returnVal = EV_F8 ; break ;
- case 0x65: returnVal = EV_F9 ; break ;
- case 0x67: returnVal = EV_F11 ; break ;
- case 0x69: returnVal = EV_F13 ; break ;
- case 0x6B: returnVal = EV_F14 ; break ;
- case 0x6D: returnVal = EV_F10 ; break ;
- case 0x6F: returnVal = EV_F12 ; break ;
- case 0x71: returnVal = EV_F15 ; break ;
- case 0x72: returnVal = EV_HELP ; break ;
- case 0x73: returnVal = EV_HOME ; break ;
- case 0x74: returnVal = EV_PAGE_UP ; break ;
- case 0x75: returnVal = EV_DELETE ; break ;
- case 0x76: returnVal = EV_F4 ; break ;
- case 0x77: returnVal = EV_END ; break ;
- case 0x78: returnVal = EV_F2 ; break ;
- case 0x79: returnVal = EV_PAGE_DOWN ; break ;
- case 0x7A: returnVal = EV_F1 ; break ;
- case 0x7B: returnVal = EV_LEFT_ARROW ; break ;
- case 0x7C: returnVal = EV_RIGHT_ARROW ; break ;
- case 0x7D: returnVal = EV_DOWN_ARROW ; break ;
- case 0x7E: returnVal = EV_UP_ARROW ; break ;
- case 0x7F: returnVal = EV_RESET ; break ;
- default: returnVal = EV_UNKNOWN_CTRL ;
- }
- return returnVal ;
- }
-
-